/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.clyme.expediente.daoImpl;


import com.clyme.expediente.dao.GenericDao;
import com.clyme.expediente.entidad.TipoExpediente;
import com.clyme.expediente.hibernate.IConexionHibernate;
import com.clyme.expediente.utilitarios.DataBaseException;
import com.clyme.expediente.utilitarios.IConexion;
import com.clyme.expediente.utilitarios.Utilitario;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.hibernate.exception.ConstraintViolationException;

/**
 *
 * @author Luis Alonso Ballena Garcia
 * @param <T>
 */
public class HibernateImpl<T> implements GenericDao<T> {

    static final Logger log = Utilitario.LOG;
    protected final IConexionHibernate conexion;

    public HibernateImpl(IConexion conexion) {
        this.conexion = (IConexionHibernate) conexion;
    }

    @Override
    public void agregar(T t) throws DataBaseException {
        Session session = null;
        try {
            session = conexion.getSession();
            session.save(t);
        } catch (HibernateException e) {
            log.error("Error de Hibernate", e);
            throw new DataBaseException("Ha existido un error en la base de datos al insertar");
        }
    }

    @Override
    public void eliminar(T t) throws DataBaseException {
        Session session = null;
        try {
            session = conexion.getSession();
            session.delete(t);
        } catch (ConstraintViolationException e) {
            log.error("Error de Hibernate", e);
            throw new DataBaseException("No se puede eliminar dicho registro debido a que es usado en otros campos");
        } catch (HibernateException e) {
            log.error("Error de Hibernate", e);
            throw new DataBaseException("Ha existido un error en la base de datos al eliminar");
        }
    }

    @Override
    public void actualizar(T t) throws DataBaseException {
        Session session = null;
        try {
            session = conexion.getSession();
            session.update(t);
        } catch (HibernateException e) {
            e.printStackTrace();
            throw new DataBaseException("Ha existido un error en la base de datos al actualizar");
        }
    }

    @Override
    public List<T> obtenerTodos(Class<T> clase) throws DataBaseException {
        Session session = null;
        List<T> listaAuxiliar = new ArrayList<T>();
        try {
            session = conexion.getSession();
            listaAuxiliar = session.createCriteria(clase).list();
        } catch (HibernateException e) {
            log.error("Error de Hibernate", e);
            throw new DataBaseException("Ha existido un error en la base de datos al llamar los registros de " + clase.getSimpleName());
        }
        return listaAuxiliar;
    }
    
    

    @Override
    public T buscarPorId(Class<T> clase, int id) throws DataBaseException {
        T t = null;
        try {
            Session session = conexion.getSession();
            t = (T) session.get(clase, id);
        } catch (HibernateException e) {
            log.error("Error de Hibernate", e);
            throw new DataBaseException("Ha existido un error en la base de datos al llamar al registro de " + clase.getSimpleName());
        }
        return t;
    }

    @Override
    public List<T> obtenerTodosActivos(Class<T> clase) throws DataBaseException {
        Session session = null;
        List<T> listaAuxiliar = new ArrayList<T>();
        try {
            session = conexion.getSession();
            listaAuxiliar = session.createCriteria(clase,"clase").add(Restrictions.eq("clase.habilitado",Short.valueOf("1"))).list();
        } catch (HibernateException e) {
            e.printStackTrace();
            log.error("Error de Hibernate", e);
            throw new DataBaseException("Ha existido un error en la base de datos al llamar los registros de " + clase.getSimpleName());
        }
        return listaAuxiliar;
    }

}
